package org.person.gift.exception;

import cn.hutool.core.util.StrUtil;

import java.util.Collection;
import java.util.Objects;

/**
 * 断言工具类
 * 什么是断言??
 * 如果断言一个结果为true,那么当它为false的时候就要抛出异常
 * 如果断言一个结果为false,那么当它为true的时候就要抛出异常
 */
public class SystemAssert {

    /**
     * lang3的StringUtils中isBlank和isEmpty区别是什么??
     * isNotEmpty()判断字符串不能为null,且长度要大于0
     * isNotBlank()不仅要判断字符串不能为null,且长度要大于0,而且字符串里面的元素不能都是" "
     * String str = "       ";
     * isNotEmpty()   true   isNotBlank() false
     */
    /**
     * 断言字符串为空,那么当字符串不为空时要抛出异常
     * 字符串的非空校验以及集合的非空校验是不能使用Objects的,因为Objects的isNull nonNull 都只判断对象是否为null,
     * @param str 是要进行校验的字符串
     * @param message  异常信息,这是个工具类,每个地方都有可能要调,它的错误信息是不固定的
     */
    public static void isBlank(String str,String message){
        // 字符串不为空时要抛出异常
        if(StrUtil.isNotBlank(str)){
            throw new BusinessException(message);
        }
    }

    // 断言字符串不为null
    public static void isNotBlank(String str,String message){
        // 字符串为空时要抛出异常
        if(StrUtil.isBlank(str)){
            throw new BusinessException(message);
        }
    }

    // 断言对象为空
    public static void isNull(Object obj,String message){
        if(Objects.nonNull(obj)){
            throw new BusinessException(message);
        }
    }

    // 断言对象不为空
    public static void isNotNull(Object obj,String message){
        if(Objects.isNull(obj)){
            throw new BusinessException(message);
        }
    }

    // 断言集合为空
    public static void isNull(Collection collection, String message){
        // 集合不为空就要抛出异常
        if(collection != null && collection.size() > 0){
            throw new BusinessException(message);
        }
    }

    // 断言集合不为空
    public static void isNotNull(Collection collection, String message){
        // 集合为空就要抛出异常
        if(collection == null || collection.size() == 0){
            throw new BusinessException(message);
        }
    }

    // 断言两个字符串相等
    public static void isEq(String str1,String str2,String message){
        if(!str1.equals(str2)){
            throw new BusinessException(message);
        }
    }

    //===========================以上的断言工具都是只传递message,以下的方法传递ResponseCode=====================================
    public static void isBlank(String str,ResponseCode code){
        // 字符串不为空时要抛出异常
        if(StrUtil.isNotBlank(str)){
            throw new BusinessException(code);
        }
    }

    // 断言字符串不为null
    public static void isNotBlank(String str,ResponseCode code){
        // 字符串为空时要抛出异常
        if(StrUtil.isBlank(str)){
            throw new BusinessException(code);
        }
    }

    // 断言对象为空
    public static void isNull(Object obj,ResponseCode code){
        if(Objects.nonNull(obj)){
            throw new BusinessException(code);
        }
    }

    // 断言对象不为空
    public static void isNotNull(Object obj,ResponseCode code){
        if(Objects.isNull(obj)){
            throw new BusinessException(code);
        }
    }

    // 断言集合为空
    public static void isNull(Collection collection, ResponseCode code){
        // 集合不为空就要抛出异常
        if(collection != null && collection.size() > 0){
            throw new BusinessException(code);
        }
    }

    // 断言集合不为空
    public static void isNotNull(Collection collection, ResponseCode code){
        // 集合为空就要抛出异常
        if(collection == null || collection.size() == 0){
            throw new BusinessException(code);
        }
    }

    // 断言两个字符串相等
    public static void isEq(String str1,String str2,ResponseCode code){
        if(!str1.equals(str2)){
            throw new BusinessException(code);
        }
    }

    public static void isEqIgnoreCase(String str1,String str2,ResponseCode code){
        if(!str1.equalsIgnoreCase(str2)){
            throw new BusinessException(code);
        }
    }
}
